{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d764323a",
   "metadata": {},
   "source": [
    "# BoardDocs Crawl\n",
    "\n",
    "Let's figure out how to crawl BoardDocs!\n",
    "\n",
    "We'll try the Redwood City School District site using BeautifulSoup.\n",
    "\n",
    "https://go.boarddocs.com/ca/redwood/Board.nsf/Public"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "903d5cbf",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Each site may contain multiple committees, we have to pick which we want to index\n",
    "# For example, RCSD's Board of Trustees is committee A4EP6J588C05 in ca/redwood\n",
    "\n",
    "site = \"ca/redwood\"\n",
    "committeeID = \"A4EP6J588C05\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1499236d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Status returned by meetings list request: 200\n"
     ]
    }
   ],
   "source": [
    "# We'll use the requests module to fetch info here.\n",
    "\n",
    "import requests\n",
    "\n",
    "# set up the BoardDocs endpoints based on params we were passed.\n",
    "baseURL = \"https://go.boarddocs.com/\" + site + \"/Board.nsf\"\n",
    "publicURL = baseURL + \"/Public\"\n",
    "meetingsListURL = baseURL + \"/BD-GetMeetingsList?open\"\n",
    "\n",
    "# set up the headers required for the server to answer\n",
    "headers = {\n",
    "    \"accept\": \"application/json, text/javascript, */*; q=0.01\",\n",
    "    \"accept-language\": \"en-US,en;q=0.9\",\n",
    "    \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n",
    "    \"sec-ch-ua\": '\"Google Chrome\";v=\"113\", \"Chromium\";v=\"113\", \"Not-A.Brand\";v=\"24\"',\n",
    "    \"sec-ch-ua-mobile\": \"?0\",\n",
    "    \"sec-ch-ua-platform\": '\"macOS\"',\n",
    "    \"sec-fetch-dest\": \"empty\",\n",
    "    \"sec-fetch-mode\": \"cors\",\n",
    "    \"sec-fetch-site\": \"same-origin\",\n",
    "    \"x-requested-with\": \"XMLHttpRequest\",\n",
    "}\n",
    "\n",
    "# set the committee\n",
    "data = \"current_committee_id=\" + committeeID\n",
    "\n",
    "# POST the request!\n",
    "response = requests.post(meetingsListURL, headers=headers, data=data)\n",
    "\n",
    "print(\"Status returned by meetings list request:\", response.status_code)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6c8ffbc4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "278 meetings found\n"
     ]
    }
   ],
   "source": [
    "# Now we're going to parse the JSON data.\n",
    "\n",
    "# Response is a JSON array of meetings, in this format:\n",
    "# [{\"unique\": \"CPSNV9612DF1\",\n",
    "#  \"name\": \"Board of Trustees Regular Meeting - 7:00pm (Closed Session at 6:15 PM)\",\n",
    "#  \"current\": \"1\",\n",
    "#  \"preliveoak\": \"\",\n",
    "#  \"numberdate\": \"20230510\",\n",
    "#  \"unid\": \"BE4CAA121D6BFD458525896E00612DF1\"},\n",
    "\n",
    "# print(response.text)\n",
    "\n",
    "import json\n",
    "\n",
    "meetingsData = json.loads(response.text)\n",
    "\n",
    "meetings = [\n",
    "    {\n",
    "        \"meetingID\": meeting.get(\"unique\", None),\n",
    "        \"date\": meeting.get(\"numberdate\", None),\n",
    "        \"unid\": meeting.get(\"unid\", None),\n",
    "    }\n",
    "    for meeting in meetingsData\n",
    "]\n",
    "\n",
    "print(str(len(meetings)) + \" meetings found\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8e802fd0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Here's an alternate approach, there's apparently an XML feed..\n",
    "\n",
    "import xml.etree.ElementTree as ET\n",
    "\n",
    "xmlMeetingListURL = baseURL + \"/XML-ActiveMeetings\"\n",
    "xmlMeetingListData = requests.get(xmlMeetingListURL)\n",
    "xmlMeetingList = ET.fromstring(xmlMeetingListData)\n",
    "\n",
    "# The returned XML document is in this form:\n",
    "\n",
    "# <meetings>\n",
    "# <meeting bodyid=\"A4EP6J588C05\" bodyname=\"Board of Trustees\" id=\"C55TDQ76E688\" order=\"1\">\n",
    "# <name>Board of Trustees Regular Meeting - 7:00pm</name>\n",
    "# <start>\n",
    "# <date format=\"yyyy-mm-dd\">2021-08-11</date>\n",
    "# <english>\n",
    "# <weekday>Wednesday</weekday>\n",
    "# <date>August 11, 2021</date>\n",
    "# </english>\n",
    "# </start>\n",
    "# <description>Please click the video link above to access the regular board meeting EDUCATING EVERY CHILD FOR SUCCESS REDWOOD CITY SCHOOL DISTRICT BOARD OF EDUCATION REGULAR MEETING WEDNESDAY, AUGUST 11, 2021 AT 7:00pm TELECONFERENCE MEETING https://rcsdk8-net.zoom.us/s/86849531859 (to participate in the Regular Board Meeting) US : +1 669 900 6833 or +1 346 248 7799 or +1 301 715 8592 or +1 312 626 6799 or +1 929 436 2866 or +1 253 215 8782 Webinar ID: 868 4953 1859 Password: rcsdbot Backup Password: 0863523 (to listen to the Regular Board Meeting) TELECONFERENCE NOTIFICATION for the REGULAR BOARD MEETING In light of the current Public Health Emergency and consistent with the Governor&#8217s recent order suspending some of the Brown Act&#8217s teleconferencing requirements, the Board will be holding its August 11th regular meeting by teleconference. The Board invites the public to join the open session portion of the meeting and offer public comment via Zoom. Additionally, the meeting will be recorded and staff will be available to receive real-time comments via the links below. Comments received during the open session of the meeting will be shared publicly during the meeting: ENGLISH https://docs.google.com/forms/d/e/1FAIpQLSexN3rAtNYJrhCjKT0s9AG__Eq0-_iAUFPI6ID3Mo0Jn8yeGA/viewform?usp=sf_link SPANISH https://docs.google.com/forms/d/e/1FAIpQLScMO3Wo8kjGmJF7KNhihQqanOLfzfoyQ7IT904jU9QtFFF28Q/viewform?usp=sf_link If you require Spanish interpretation please call: 978-990-5137 and press 8377041# for the password. Si require interpretaci&#243n al espa&#241ol por favor llame al: 978-990-5137 y presione 8377041# para la contrase&#241a. If you need special assistance or a modification due to a disability (including auxiliary aids or services) to participate in this meeting, please contact Eliana Garc&#237a at egarcia@rcsdk8.net at least 48 hours in advance of the meeting and we will make our best efforts to accommodate.</description>\n",
    "# <link>http://go.boarddocs.com/ca/redwood/Board.nsf/goto?open&id=C55TDQ76E688</link>\n",
    "# <category id=\"C55TDR76E689\" order=\"1\">\n",
    "# <name>1. Call to Order</name>\n",
    "# <agendaitems>\n",
    "# <item id=\"C55TDS76E68A\" order=\"1\">\n",
    "# <name>1.1 Roll Call</name>\n",
    "# <link>http://go.boarddocs.com/ca/redwood/Board.nsf/goto?open&id=C55TDS76E68A</link>\n",
    "# <actiontype>Procedural</actiontype>\n",
    "# </item>\n",
    "# </agendaitems>\n",
    "# </category>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b292ff49",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Status returned by detailed agenda fetch request: 200\n",
      "Agenda Title: Board of Trustees Regular Meeting - 7:00pm (Closed Session at 6:15 PM)\n",
      "Agenda Date: Wednesday, May 10, 2023\n",
      "Number of Files: 33\n",
      "['/ca/redwood/Board.nsf/files/CRAQFV6923F8/$file/230510%20RCSD%20%2420k%20and%20Under%20Tracker%20FY%2022-23.pdf', '/ca/redwood/Board.nsf/files/CRASSK741766/$file/230510%20RCSD%20GA%20Bid%20Package%20D%20CO%20No.%2014%20Package.pdf', '/ca/redwood/Board.nsf/files/CRATNB7827AD/$file/230510%20RCSD%20GA%20Bid%20Package%20G%20CO%20No.%2016%20Package.pdf', '/ca/redwood/Board.nsf/files/CR9SWS74B531/$file/01-118012_Invoice_01-13356_2023-04-18.pdf', '/ca/redwood/Board.nsf/files/CRFNZ4615266/$file/3250%20BP_AR%20Transportation%20Fees.pdf', '/ca/redwood/Board.nsf/files/CRFP8N62304A/$file/3540%20BP%20Transportation.pdf', '/ca/redwood/Board.nsf/files/CRFPGE63E9A7/$file/3555%20BP_E%20Nutrition%20Program%20Compliance.pdf', '/ca/redwood/Board.nsf/files/CRFPM964FB8C/$file/4030%20BP_AR%20Nondiscrimination%20in%20Employment.pdf', '/ca/redwood/Board.nsf/files/CRFPVX66768F/$file/5142%20BP_AR%20Safety.pdf', '/ca/redwood/Board.nsf/files/CRFQDT68D3B9/$file/5142.2%20BP_AR%20Safe%20Routes%20to%20School%20Program.pdf', '/ca/redwood/Board.nsf/files/CRFR8D6B7403/$file/9320%20BB%20Meetings%20and%20Notices.pdf', '/ca/redwood/Board.nsf/files/CRJPQY62B0F7/$file/Board%20Minutes%2004.19.23%20DRAFT.Regular.pdf', '/ca/redwood/Board.nsf/files/CRJPQL62A3B4/$file/Board%20Minutes%2004.26.2023%20DRAFT%20-%20CLOSED.pdf', '/ca/redwood/Board.nsf/files/CRJPRM62D8F5/$file/Board%20Minutes%204.26.23%20DRAFT%20(Study%20Session).pdf', '/ca/redwood/Board.nsf/files/CRBTS978BA27/$file/Master%20Contract%202022-2023(final).pdf', '/ca/redwood/Board.nsf/files/CRBTSB78BBDB/$file/Approved%20Rate%20Sheets%204.19.pdf', '/ca/redwood/Board.nsf/files/CRETMP6C923E/$file/UC%20REGENTS%20RCSD%20CRLP.pdf', '/ca/redwood/Board.nsf/files/CRJVHK80D60D/$file/UC%20REGENTS%20RCSD%20CRLP%20Amendment.pdf', '/ca/redwood/Board.nsf/files/CRJVGC80A7F2/$file/SMCOE%2023-24%20Teacher%20Residency%20Agreement.pdf', '/ca/redwood/Board.nsf/files/CRJV5P7F1674/$file/2023.24%20RCSD%20Outdoor%20Education.pdf', '/ca/redwood/Board.nsf/files/CRFLZV581C06/$file/Warrant%20Register%20April%202023.pdf', '/ca/redwood/Board.nsf/files/CRHVKX812F21/$file/230510%20Connect%20AB841%20Resolution%2033.pdf', '/ca/redwood/Board.nsf/files/CRHVWC82B4EB/$file/230510%20KIPP%20Excelencia%20AB841%20Resolution%2034.pdf', '/ca/redwood/Board.nsf/files/CRHVYE82FE9B/$file/230510%20Redwood%20City%20School%20District%20AB841%20Resolution%2035.pdf', '/ca/redwood/Board.nsf/files/CRHVZR833219/$file/230510%20Rocketship%20AB841%20Resolution%2036.pdf', '/ca/redwood/Board.nsf/files/CRERDF6750EE/$file/KIPP%20Excelencia%2022.23%202nd%20Interim%20Report%20Review%20Letter.pdf', '/ca/redwood/Board.nsf/files/CRERPC6862FD/$file/KIPP%20Excelencia%20%2022.23%202nd%20Interim%20Report.pdf', '/ca/redwood/Board.nsf/files/CRERMM682F52/$file/Connect%2022.23%202nd%20Interim%20Report%20Review%20Letter.pdf', '/ca/redwood/Board.nsf/files/CRERNM68494F/$file/Connect%20%2022.23%202nd%20Interim%20Report.pdf', '/ca/redwood/Board.nsf/files/CRERSD68BED6/$file/Rocketship%20RC%2022.23%202nd%20Interim%20Report%20Review%20Letter.pdf', '/ca/redwood/Board.nsf/files/CRERS968BC64/$file/Rocketship%20RC%2022.23%202nd%20Interim%20Report.pdf', '/ca/redwood/Board.nsf/files/CRFNG75F3C1B/$file/5131.41%20AR%20Use%20Of%20Seclusion%20And%20Restraint.pdf', '/ca/redwood/Board.nsf/files/CRHQ3P673134/$file/22-23%20RCSD%20Board%20Meeting%20Calendar.Updated%204.19.23.pdf']\n"
     ]
    }
   ],
   "source": [
    "# Ah HA! The detailes \"print\" agenda has all the info we want - and links to the PDFs!\n",
    "\n",
    "detailedMeetingAgendaURL = baseURL + \"/PRINT-AgendaDetailed\"\n",
    "\n",
    "meetingID = \"CPSNV9612DF1\"\n",
    "\n",
    "# set the meetingID & committee\n",
    "data = \"id=\" + meetingID + \"&\" + \"current_committee_id=\" + committeeID\n",
    "\n",
    "# POST the request!\n",
    "response = requests.post(detailedMeetingAgendaURL, headers=headers, data=data)\n",
    "\n",
    "print(\"Status returned by detailed agenda fetch request:\", response.status_code)\n",
    "\n",
    "import html2text\n",
    "from bs4 import BeautifulSoup\n",
    "\n",
    "# parse the returned HTML\n",
    "soup = BeautifulSoup(response.content, \"html.parser\")\n",
    "agendaDate = soup.find(\"div\", {\"class\": \"print-meeting-date\"}).string\n",
    "agendaTitle = soup.find(\"div\", {\"class\": \"print-meeting-name\"}).string\n",
    "agendaFiles = [\n",
    "    fd.a.get(\"href\") for fd in soup.find_all(\"div\", {\"class\": \"public-file\"})\n",
    "]\n",
    "agendaData = html2text.html2text(response.text)\n",
    "print(\"Agenda Title:\", agendaTitle)\n",
    "print(\"Agenda Date:\", agendaDate)\n",
    "print(\"Number of Files:\", len(agendaFiles))\n",
    "\n",
    "print(agendaFiles)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "81571996",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPSNV9612DF1\n",
      "CPNUPZ7B7D09\n",
      "CQ7TPZ78313B\n",
      "CR2MCR59EE37\n",
      "CNUN245B80D7\n",
      "CNCQ2F663B8C\n",
      "CPWNM5605E00\n",
      "CNCPQY64EE36\n",
      "CMSTNT783963\n",
      "CMSTML77B689\n",
      "CN9V837F7242\n",
      "CMZR4H6C2928\n",
      "CMBPD95DF6DB\n",
      "CKYUYU7E62A8\n",
      "CLLPZT5E8971\n",
      "CKJKSG533AF1\n",
      "CKHSER725DEA\n",
      "CK4PBG638FA6\n",
      "CJYTL8775FA8\n",
      "CJANRA6126F9\n",
      "CK6PAK62FF2D\n",
      "CK6N565C9EB6\n",
      "CJ2S33686A4D\n",
      "CHKLWM588244\n",
      "CHEM3K58E555\n",
      "CHEMVQ5D1F0F\n",
      "CH4UY57E3BD1\n",
      "CFLT9N7492F3\n",
      "CFFTMD7567B0\n",
      "CF8Q7X66C51F\n",
      "CETRFZ6DD9CE\n",
      "CF7TF6771C58\n",
      "CEPKKH523FEC\n",
      "CEBNMZ5DAC30\n",
      "CDWQH3694A8D\n",
      "CDARDL6D82AB\n",
      "CDFKEW510C6E\n",
      "CCSN6X5E7859\n",
      "CCMRJT6E4626\n",
      "CC5UYY7E6893\n",
      "CBJQLT6911AB\n",
      "CBATCX765D01\n",
      "CAYM47593BD6\n",
      "CAFRFB6D7A83\n",
      "CABM9357C659\n",
      "CACUCV7B77BB\n",
      "C9BVZ5831E3D\n",
      "C8SP2G6169F1\n",
      "C8FTNP72595E\n",
      "C8MQ92681B5B\n",
      "C87LTS552926\n",
      "C7XVCJ801ABC\n",
      "C7KUF87BCE71\n",
      "C72NJ46017D1\n",
      "C75M5L592D5D\n",
      "C6GTZ9796118\n",
      "C6DRX2700FAB\n",
      "C63URL79A65D\n",
      "C66PAR62DFB1\n",
      "C5LNS66103E7\n",
      "C55TDQ76E688\n",
      "CRN7DG191DCC\n",
      "CRN63A12EF28\n",
      "CRP2ZC7DEDD9\n",
      "CRM2R703650F\n",
      "CRM2YY0488C9\n",
      "CRJ2SA01B8F1\n",
      "CRLUJK7C4CE2\n",
      "CRJ2QE00512B\n",
      "CRH24J005DC4\n",
      "CRKVVW82A567\n",
      "CRFVN48180D5\n",
      "CRE4XS0DBC93\n",
      "CRE4S90CEC88\n",
      "CRDUU67DB46C\n",
      "CQNLT957DAEE\n",
      "CRAUSP7B7A9A\n",
      "CR8TSZ78D926\n",
      "CR72JE026707\n",
      "CR6U2Q79FA31\n",
      "CR62XM0455DD\n",
      "CQZ75B17EB8C\n",
      "CQXU6T7A9410\n",
      "CQXU4L7A403C\n",
      "CQXT7R7606A0\n",
      "CQWT8A761B85\n",
      "CQWSTR74456C\n",
      "CQWPSF66018B\n",
      "CQV3X908F7FA\n",
      "CQS5N81105E8\n",
      "CQR34Z052019\n",
      "CQQ83K1C5A77\n",
      "CQQ7BN18D917\n",
      "CQP87H1CEE10\n",
      "CQN2Y404680E\n",
      "CQL2SY03A75A\n",
      "CQKVEX8074FB\n",
      "CQF3F5069B40\n",
      "CQD2Z9049366\n",
      "CQC4LQ0C1D32\n",
      "CQB3CV064707\n",
      "CQB34N05137F\n",
      "CQ5VS9821D50\n",
      "CQ3VGR80B8D8\n",
      "CQ3VQF81D881\n",
      "CQ3UQE7D2740\n",
      "CQ2UQE7D27BF\n",
      "CPYV2A7E99F1\n",
      "CPY28V010165\n",
      "CPW64G131BA5\n",
      "CPN4FD0B53C7\n",
      "CPU8MD1EF61A\n",
      "CPP6ZA1753E4\n",
      "CPN4AS0AA855\n",
      "CPN4790A23E1\n",
      "CPTVEK806706\n",
      "CPT45Y09F4C5\n",
      "CPN3ZS095791\n",
      "CPS2TU7C428F\n",
      "CPN3UA088940\n",
      "CPL7AA18A582\n",
      "CPR2X2043FEA\n",
      "CPK46K0A0ADB\n",
      "CPH3E20672F6\n",
      "CPH3AF05EB4E\n",
      "CPQ3A705E24F\n",
      "CPEQSE6AB2FE\n",
      "CPEQKY69C163\n",
      "CPEQAJ685EFF\n",
      "CPEQJN698FE0\n",
      "CPE8N71F1438\n",
      "CPC3TR08758C\n",
      "CPB4FT0B658A\n",
      "CP9L5W54ED29\n",
      "CP93X508F31A\n",
      "CP92V603F9AE\n",
      "CP5VCP802000\n",
      "CP5UNX7CF030\n",
      "CP44MF0C354D\n",
      "CP327T00D8ED\n",
      "CNXTPN785AFD\n",
      "CNV5480E625A\n",
      "CNTBZL155845\n",
      "CNU3VM08BBD4\n",
      "CNS5EE0FE08E\n",
      "CNS3MB0783F9\n",
      "CNHVMU81772C\n",
      "CNG26A005BE8\n",
      "CNE2UT03EB26\n",
      "CND7B218C26C\n",
      "CND6WV16F9F8\n",
      "CNM3VE08B384\n",
      "CNL4FD0B5575\n",
      "CNC4DV0B1C65\n",
      "CNC3H406E589\n",
      "CNB9D822744D\n",
      "CNB95X216314\n",
      "CNB8US200C24\n",
      "CNB94P2133E5\n",
      "CNB8BG1D8279\n",
      "CN77C618EBDC\n",
      "CN935C052CA0\n",
      "CN7788185851\n",
      "CN76VE16C3B6\n",
      "CN85ZP12B3BE\n",
      "CN3SBF71DFBD\n",
      "CNK27Z00E06F\n",
      "CNJUWP7E12B6\n",
      "CMX79Z189B0F\n",
      "CN657P0EE500\n",
      "CMX6VG16C613\n",
      "CMX6SK165849\n",
      "CMX6M6158D53\n",
      "CNJ28K00F603\n",
      "CN3SED724EF6\n",
      "CMV99R21F29E\n",
      "CMW3GL06D288\n",
      "CMV8YD20921A\n",
      "CMV8C61D9C8C\n",
      "CMV6R516227D\n",
      "CMSW4582A51D\n",
      "CMV266009B40\n",
      "CMSUXJ7E32AC\n",
      "CMR42J097328\n",
      "CMPURD7D4BCD\n",
      "CMPSJP72F16A\n",
      "CMQ7GD198AD2\n",
      "CMPS5U710FE0\n",
      "CMPRMB6EA3EE\n",
      "CMP8H61E5797\n",
      "CMP7FW1978AB\n",
      "CMJ3TE0867D8\n",
      "CMJ3Q607EE18\n",
      "CMP6GV14ED50\n",
      "CMJ3KH073FE4\n",
      "CMN3K50731E5\n",
      "CMJ3EL06879A\n",
      "CMM8DD1DC2BC\n",
      "CMM6TQ168411\n",
      "CMHU9N7AFDF2\n",
      "CMHNZN626280\n",
      "CMH8WH204C01\n",
      "CMH8U31FF10B\n",
      "CMH8NV1F2E0B\n",
      "CMH2VQ040EC4\n",
      "CMH2PG03245D\n",
      "CMH228000800\n",
      "CMD25M0087B4\n",
      "CMCRBN6D3703\n",
      "CMB2TF03B9B2\n",
      "CMC4970A6D1B\n",
      "CMB2R90366BD\n",
      "CMB2FN01FF45\n",
      "CMAVBT7FFF73\n",
      "CMAUME7793B2\n",
      "CMAUQH78BB41\n",
      "CMA6QH160B8E\n",
      "CM965U134FE6\n",
      "CMA52X0E32D0\n",
      "CLX75717E76B\n",
      "CM63WT08E776\n",
      "CLX6J21518B0\n",
      "CLV6HH1504C3\n",
      "CLM8ZW20CC65\n",
      "CLK99T21F46E\n",
      "CLM7X31BB117\n",
      "CLK8CY1DBAE9\n",
      "CLH2G3020E36\n",
      "CLGV447EDE4F\n",
      "CLF5FQ1011E2\n",
      "CLD66J13695C\n",
      "CLD4LF0C1288\n",
      "CLC8G51E30C7\n",
      "CLC7DV192CA4\n",
      "CLC6YX174706\n",
      "CLB87A1CE5C8\n",
      "CLB3DH0653B9\n",
      "CLA4CR0AF29A\n",
      "CKYW3V8385D2\n",
      "CKYV9X7FB91E\n",
      "CKY3R708141A\n",
      "CKWS5S710CF7\n",
      "CKWPMF65483E\n",
      "CKW6XR171B8E\n",
      "CM46K7154372\n",
      "CM56F314A917\n",
      "CM467H138D7F\n",
      "CM34KQ0BF7D4\n",
      "CM23LK076765\n",
      "CM22MW02E95B\n",
      "CM2242004BF0\n",
      "CLZVYG830594\n",
      "CLZ79R189275\n",
      "CLZVVN829C4B\n",
      "CLX4YY0DE92B\n",
      "CLW7PD1A9067\n",
      "CLW7BG18D117\n",
      "CJYN775E1AED\n",
      "CK5NDA5F4AFD\n",
      "CLW77L1840EF\n",
      "CKW4YZ0DE9A9\n",
      "CKW63X130795\n",
      "CKVRW66FEDCB\n",
      "CKVRME6EA743\n",
      "CKTV7K7F5FAD\n",
      "CKTUCJ7B2B51\n",
      "CKTSMP71C7BE\n",
      "CKRUTH7D9B57\n",
      "CKS2BT783AEC\n",
      "CKRVS770AD19\n",
      "CKRQPD6A3A65\n",
      "CKRPGX649F6E\n",
      "CKR672137C3D\n",
      "CKRM8259E4A5\n",
      "CKPVDA803654\n",
      "CKP85E1C9F16\n",
      "CKNRDA6D762A\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "# Fetch meeting agenda for each meeting\n",
    "\n",
    "for meeting in meetings:\n",
    "    print(meeting[\"meetingID\"])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
